package com.song.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

/*
    springSecurity配置
 */
@Configuration
@EnableWebSecurity //开启SpringSecurity功能
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    // 授权: 对应资源只能哪些角色权限的人访问
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 对于根路径/的请求，允许所有用户访问
        // 对于/level1的请求，允许角色是vip1的用户访问
        http.authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/level1/**").hasRole("vip1")
                .antMatchers("/level2/**").hasRole("vip2")
                .antMatchers("/level3/**").hasRole("vip3");



        // 登录，开启默认的登录表单，用户可以在这个表单中输入用户名和密码，Spring Security会自动处理这些信息。
        //http.formLogin().defaultSuccessUrl("/",true);
        // 定制登录页   设置登录页为我们自己写的好看的登录页
        http.formLogin().
                loginPage("/toLogin");  // 或者:显示的指出登录时候，表单绑定的参数  配置了Spring Security的登录表单
        //http.formLogin().loginPage("/toLogin").usernameParameter("username").passwordParameter("password").loginProcessingUrl("/toLogin");



        // 注销，开启了注销功能 清除cookies，删除session
        //http.logout().deleteCookies("remove").invalidateHttpSession(true);
        //http.logout().logoutSuccessUrl("/");  //登出后跳转到首页
        http.logout()
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                .deleteCookies("remove").invalidateHttpSession(true)
                .logoutSuccessUrl("/");



        // 开启security自带的记住我功能，本质cookie，浏览器默认保存14天有效
        // 实现效果：用户登录后，没有注销的情况下，关闭浏览器页面，再次打开登录页时，刚才登录的用户依然存在
        //http.rememberMe();
        // 定制登录页的记住我：自定义接收前段参数
        http.rememberMe()
                .rememberMeParameter("remember");

    }



    // 认证: 账号密码角色身份验证
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // super.configure(auth);  意思是调用弗雷德configure()方法，执行默认的配置
        // 在父类的配置上可以添加额外的配置   auth.inMemoryAuthentication().withUser("user").password("123").roles("USER")
        // 其他配置


        // 从数据库中去读用户信息 内存认证下密码加密
        // admin：有所有角色菜单栏查看权限、  user:有角色vip1,vip2菜单栏查看权限、  visitor：游客有vip1角色的菜单栏查看权限
        auth.inMemoryAuthentication()
                .passwordEncoder(new BCryptPasswordEncoder())
                .withUser("admin").password(new BCryptPasswordEncoder().encode("123")).roles("vip1","vip2","vip3")
                .and()
                .withUser("user").password(new BCryptPasswordEncoder().encode("123")).roles("vip1","vip2")
                .and()
                .withUser("visitor").password(new BCryptPasswordEncoder().encode("123")).roles("vip1");
    }
}
